package com.itheima.edu.info.manager.dao;

import com.itheima.edu.info.manager.domain.Student;

import java.io.*;
import java.util.ArrayList;
import java.util.Properties;

/*
    库管类
        使用集合来作为数据仓库
 */
public class OtherStudentDao implements BaseStudentDao {

    //1. 定义一个长度为5的数组,作为整个系统的数据容器
    private static ArrayList<Student> stus = new ArrayList<Student>();

    //静态代码块: 在系统进行类加载时读取文件数据进行信息的初始化
    static {
        System.out.println("---------------loading--------------------");
        //加载服务端的数据
        load04();
    }


    //服务端库管类中的添加功能
    public boolean addStudent(Student stu) {
        stus.add(stu);
        //服务端的数据存档
        reSave04();
        return true;
    }

    //服务端的查询功能
    public ArrayList<Student> findAllStudents() {
        //返回集合
        return stus;
    }

    //库管类中的删除功能
    public void deleteStudentId(String delId) {
        //1. 找到当前要删除的学号对应的学生对象在数组容器中索引位置
        int index = getIndex(delId);
        //2. 用null去覆盖掉该索引位置的学生对象,从而达到删除效果
        stus.remove(index);
        //数据存档
        reSave04();
    }

    //库管类中的修改功能
    public boolean updateStudentById(String newStu) {
        //1. 切割字符串创建学生对象
        String[] split = newStu.split(",");
        Student stu = new Student(split[0], split[1], split[2], split[3]);
        //获取修改对象的id对应的索引
        int index = getIndex(stu.getSid());
        //2. 将stu去覆盖掉该索引位置的旧对象,从而达到修改效果
        stus.set(index, stu);
        //数据存档
        reSave04();
        if (stus.get(index).getBirthday().equals(stu.getBirthday())) {
            return true;
        } else {
            return false;
        }
    }

    //根据学号查找对应学生对象在数组容器中的索引位置
    public int getIndex(String id) {
        //1. 先假设要查找的学号不存在,index先记录-1
        int index = -1;
        //2. 遍历数组容器
        for (int i = 0; i < stus.size(); i++) {
            //2.1 拿到每一个学生对象
            Student stu = stus.get(i);
            //2.2 判断当前学生对象的学号和要查找的学号是否相同
            if (stu != null && stu.getSid().equals(id)) {
                //相同,则说明要查找的学号存在,则修改标记为当前学生对象的索引
                index = i;
                break;
            }
        }
        //3. 返回index即可
        return index;
    }

    //服务端加载用户登录的账号和密码,并返回一个Properties类型的对象
    @Override
    public Properties findAllUsers() {
        try {
            //创建存储账号和密码的集合
            Properties prop = new Properties();
            //创建字符输入流
            FileReader fr = new FileReader("学生管理系统服务端Server\\users.txt");
            //将字符流中的数据存储到集合中
            prop.load(fr);
            //返回带有用户账户信息的集合
            return prop;
        } catch (Exception e) {
            return null;
        }
    }


    //使用缓冲字符流将数据写入文本文件的
    public void reSave04() {
        BufferedWriter bos = null;
        try {
            bos = new BufferedWriter(new FileWriter("学生管理系统服务端Server\\stu.txt"));
            for (Student student : stus) {
                bos.write(student.toString());
                bos.newLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //使用缓冲字符流加载文本文件的数据
    public static void load04() {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("学生管理系统服务端Server\\stu.txt"));
            String str;
            while ((str = br.readLine()) != null) {
                String[] split = str.split(",");
                stus.add(new Student(split[0], split[1], split[2], split[3]));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
